package com.lagou.task09;

public class ShapeRectTest {

    public static void main(String[] args) {
        //1. 声明shape类型的引用并指向shape类型的对象
        Shape s1 = new Shape(1,2);
        s1.show();
        //Rect没有show方法, 调用Shape中的show方法
        //当Rect中重写show方法的时候,调用Shape类中的show方法

        System.out.println("---------");  //使用ctrl+d复制当前行

        //2. 声明Rect类型的引用并指向Rect类型的对象
        Rect r1 = new Rect(3,4,5,6);
        r1.show();
        //Rect没有show方法, 调用Shape中的show方法
        //当Rect中重写show方法的时候,调用Rect类中的show方法

        System.out.println("---------");  //使用ctrl+shift+方向键移动当前行

        //3. 声明Shape类型的引用并指向Rect类型的对象
        //相当于Rect类型到Shape类型的转换, 小到大, 自动转换
        Shape sr = new Rect(5,6,7,8);
        sr.show();
        //Rect没有show方法, 调用Shape中的show方法
        //当Rect中重写show方法的时候,编译阶段, 调用shape类中show方法, 运行阶段,调用Rect类中的show方法

        System.out.println("---------");  //使用ctrl+shift+方向键移动当前行

        //4. 测试Shape类型的引用能否直接调用父类和子类独有的方法呢??
        int ia = sr.getX();
        System.out.println("获取的横坐标是:" + ia);
        //sr.getlen(); error Shape类中找不到getLen方法, 也就是还在Shape类中查找

        //调用静态方法
        //静态方法的调用, 取决于变量所隶属于的类型, 跟指向什么样子对象没关系
        sr.test();  //不推荐
        Shape.test(); //推荐使用类名. 的方式访问静态方法


        //5. 父类类型调用子类类型
        //相当于Shape类型到Rect类型的转换, 也就是父类到子类的转换,  大到小的转换, 强制转换
        int ib = ((Rect) sr).getLen();
        System.out.println("获取的长度是:" + ib);

        //6. 希望将Shape类型的转换为String类型, 强制类型转换要求必须拥有父子类关系
        //String str1 = (String)sr; 报错
        //Circle c1 = (Circle)sr;  编译没问题, 运行报错

        //再强制类型转换之前应该使用instanceof进行类型的判断
        //判断sr指向堆区内存中的对象是否为Circle类型, 若是, 则返回true, 否则false
        if(sr instanceof Circle){
            Circle c1 = (Circle)sr;
        } else {
            System.out.println("强转有风险, 操作需谨慎");
        }
    }
}
